Mocking এবং Dependency Injection Testing

Web Development - এএসপি ডট (ASP.Net) - Unit Testing এবং Integration Testing |
1
1

Mocking এবং Dependency Injection Testing (DIT) হল সফটওয়্যার টেস্টিং এর দুটি গুরুত্বপূর্ণ কৌশল, যা ASP.Net অ্যাপ্লিকেশনগুলোর টেস্টিং কার্যক্রমকে আরও কার্যকর ও সহজ করে তোলে। এই কৌশলগুলোর মাধ্যমে আপনি কোডের বিভিন্ন অংশের সঠিকতা যাচাই করতে পারেন এবং আপনার অ্যাপ্লিকেশনটির বিভিন্ন কম্পোনেন্টকে আলাদাভাবে পরীক্ষা করতে সক্ষম হন।

Mocking কী?

Mocking হল টেস্টিংয়ের একটি প্রক্রিয়া, যেখানে আপনি একটি নির্দিষ্ট ডিপেন্ডেন্সির আচরণ নকল করেন (mock)। এটি সাধারনত তখন ব্যবহার করা হয়, যখন আপনি নির্দিষ্ট একটি ক্লাস বা মেথডের কার্যকারিতা টেস্ট করতে চান, তবে আপনি সেটির আসল বাস্তবায়ন (implementation) না চালিয়ে শুধুমাত্র তার আউটপুট/রেসপন্স পরীক্ষা করতে চান।

Mocking সাধারণত ব্যবহার হয় যখন:

  1. কোনো নির্দিষ্ট ডিপেন্ডেন্সি সঠিকভাবে কাজ করছে কিনা তা পরীক্ষা করতে হয়।
  2. কোন বিশেষ অবস্থা বা কন্ডিশন চেক করার জন্য, যেখানে আসল ডিপেন্ডেন্সি অপ্রয়োজনীয় বা অপ্রত্যাশিত।
  3. টেস্টের সময় রিফ্যাক্টিং বা পরিবর্তন সহজ করতে।

Dependency Injection Testing কী?

Dependency Injection (DI) হল একটি ডিজাইন প্যাটার্ন, যা অ্যাপ্লিকেশনের কোডের মধ্যে ডিপেন্ডেন্সি গুলো সরাসরি ইনজেক্ট (inject) করার পরিবর্তে বাইরের কোনও কনটেইনার বা ফ্যাক্টরি থেকে ইনজেক্ট করা হয়। DI ব্যবহার করে আপনার কোড আরও টেস্টেবল, মডুলার এবং সহজে রিফ্যাক্টর করা যায়।

Dependency Injection Testing হল DI প্যাটার্নে কাজ করা অ্যাপ্লিকেশনের একক ইউনিট টেস্ট করার কৌশল। এই কৌশলের মাধ্যমে আপনি সার্ভিস বা কম্পোনেন্টের ডিপেন্ডেন্সি মক (mock) করে পরীক্ষা করতে পারেন।


১. Mocking ব্যবহার করা

ASP.Net Core অ্যাপ্লিকেশনে Moq লাইব্রেরি সবচেয়ে জনপ্রিয় একটি লাইব্রেরি, যা মক অবজেক্ট তৈরি করতে ব্যবহৃত হয়। Moq ব্যবহার করে আপনি আসল ডিপেন্ডেন্সির পরিবর্তে একটি মক (mock) অবজেক্ট তৈরি করতে পারেন, এবং সেই অবজেক্টের মাধ্যমে টেস্টিং করতে পারেন।

Moq এর মাধ্যমে Mock তৈরি করার উদাহরণ:

  1. Moq প্যাকেজ ইনস্টল করা: প্রথমে, NuGet প্যাকেজ ম্যানেজার থেকে Moq প্যাকেজ ইনস্টল করতে হবে।

    Install-Package Moq
    
  2. Mock Object তৈরি করা: এখানে আমরা একটি IUserService এর মক অবজেক্ট তৈরি করব এবং তা টেস্টে ব্যবহার করব।

    using Moq;
    using Xunit;
    
    public interface IUserService
    {
        string GetUserName(int userId);
    }
    
    public class UserController
    {
        private readonly IUserService _userService;
    
        public UserController(IUserService userService)
        {
            _userService = userService;
        }
    
        public string GetUserName(int userId)
        {
            return _userService.GetUserName(userId);
        }
    }
    
    public class UserControllerTests
    {
        [Fact]
        public void GetUserName_ReturnsCorrectUsername()
        {
            // Arrange: Mock IUserService
            var mockUserService = new Mock<IUserService>();
            mockUserService.Setup(service => service.GetUserName(It.IsAny<int>())).Returns("John Doe");
    
            var controller = new UserController(mockUserService.Object);
    
            // Act: Call the method
            var result = controller.GetUserName(1);
    
            // Assert: Verify the result
            Assert.Equal("John Doe", result);
        }
    }
    

    এখানে, IUserService এর মক অবজেক্ট তৈরি করা হয়েছে যা GetUserName মেথডটি John Doe রিটার্ন করবে। এরপর সেই মক অবজেক্ট দিয়ে UserController টেস্ট করা হয়েছে।


২. Dependency Injection Testing

ASP.Net Core এর ডিপেন্ডেন্সি ইনজেকশন সিস্টেম ব্যবহার করে আপনি আপনার সার্ভিসগুলোকে সহজে ইনজেক্ট করতে পারেন এবং তাদের মকিং বা টেস্টিং করতে পারেন।

DI টেস্টিং উদাহরণ:

  1. ASP.Net Core DI কনফিগারেশন: Startup.cs এ ডিপেন্ডেন্সি ইনজেকশন কনফিগারেশন করতে হবে। এখানে আমরা একটি IProductService এর ডিপেন্ডেন্সি ইনজেক্ট করব।

    public interface IProductService
    {
        string GetProductName(int productId);
    }
    
    public class ProductService : IProductService
    {
        public string GetProductName(int productId)
        {
            return "Product " + productId;
        }
    }
    
    public class HomeController : Controller
    {
        private readonly IProductService _productService;
    
        public HomeController(IProductService productService)
        {
            _productService = productService;
        }
    
        public IActionResult Index(int productId)
        {
            var productName = _productService.GetProductName(productId);
            return View("Index", productName);
        }
    }
    
  2. Test Project Setup: এখন আপনি ASP.Net Core DI ব্যবহার করে আপনার টেস্ট প্রজেক্ট তৈরি করবেন এবং মক অবজেক্ট ইনজেক্ট করবেন।

    public class HomeControllerTests
    {
        [Fact]
        public void Index_ReturnsProductName()
        {
            // Arrange: Mock IProductService
            var mockProductService = new Mock<IProductService>();
            mockProductService.Setup(service => service.GetProductName(It.IsAny<int>())).Returns("Mock Product");
    
            var controller = new HomeController(mockProductService.Object);
    
            // Act: Call the Index method
            var result = controller.Index(1) as ViewResult;
    
            // Assert: Verify the result
            Assert.Equal("Mock Product", result?.Model);
        }
    }
    

    এখানে, IProductService এর মক অবজেক্ট তৈরি করা হয়েছে এবং HomeController এর Index মেথড টেস্ট করা হয়েছে।


৩. Mocking এবং Dependency Injection Testing এর সুবিধা

  • আবশ্যক ডিপেন্ডেন্সি বাদ দেওয়া: Mocking দ্বারা ডিপেন্ডেন্সি বাদ দিয়ে শুধু আপনার টার্গেট কম্পোনেন্ট বা ফিচারের টেস্টিং করা যায়।
  • কোড রিফ্যাক্টরিং সহজ: DI ব্যবহারে কোডের মডুলারিটি বাড়ে, এবং এটি কোড রিফ্যাক্টরিং সহজ করে তোলে।
  • টেস্টিংে স্বচ্ছতা: Mocking ব্যবহার করে টেস্টগুলো আরো পরিষ্কার এবং দ্রুত করা যায়, কারণ আপনি শুধুমাত্র নির্দিষ্ট অংশগুলোর টেস্ট করেন এবং পুরো সিস্টেমের কার্যকারিতা নকল করতে পারেন।

সারাংশ: Mocking এবং Dependency Injection Testing ASP.Net অ্যাপ্লিকেশন টেস্টিংয়ের শক্তিশালী কৌশল, যা ডিপেন্ডেন্সির আচরণ পরীক্ষা করতে সহায়তা করে এবং কোডের মডুলারিটি ও টেস্টেবিলিটি বৃদ্ধি করে। Moq লাইব্রেরি ব্যবহার করে ASP.Net অ্যাপ্লিকেশনগুলোর ইউনিট টেস্ট করা এবং ডিপেন্ডেন্সি ইনজেকশন কনটেইনারের মাধ্যমে টেস্টিং পরিচালনা করা খুবই সহজ।

Content added By
Promotion